<?

class ProduitCommande extends genericClass
{
  
    var $Option = NULL; // Objet Produit
    var $OptionReelle = NULL; // Objet ProduitReel
    var $Dossier = NULL; // Objet Dossier
    var $TableauRegles = array("Unicite"         => false, // Tableau type pour la reconnaissance de règles
                               "Tous"            => false,
                               "AffecteUn"       => false,
                               "AffecteDeux"     => false,
                               "AffecteTrois"    => false,
                               "UnSeul"          => false,
                               "ObligatoireType" => false,
                               "Obligatoire"     => false,
                               "PasTous"         => false,
                               "ComprisAssurance"=> false);
    


   /**
     * [EDB] Affecte $this->Option, $this->OptionReelle et $this->Dossier
     * @return void
     */function getNeededObjects() {
         $ProduitReelId = -1;
         $DossierId = -1;  
	 //	 print_r($this);
         if ( !empty($this->Parents) && $this->Get("Id")=="" ) {
              foreach( $this->Parents as $Parent ) {
                  if ( $Parent["Titre"]=="ProduitReel" ) {
                      $ProduitReelId = $Parent["Id"];
                  }
                  elseif ( $Parent["Titre"]=="Dossier" ) {
                      $DossierId= $Parent["Id"];
                  }
              }

          }elseif ( $this->Get("Id") != "" ) {
              $getProduitReel = "Boutique/ProduitReel/ProduitCommande/".$this->Get("Id");
              $getDossier = "Boutique/Dossier/ProduitCommande/".$this->Get("Id");
              $ProduitsReels = $GLOBALS['Systeme']->Modules[$this->Module]->callData($getProduitReel);
              $Dossier = $GLOBALS['Systeme']->Modules[$this->Module]->callData($getDossier);
              $ProduitReelId = $ProduitsReels[0]["Id"];
              $DossierId = $Dossier[0]["Id"];
          }
         if ( $ProduitReelId!=-1) {
             $R_ProduitReel = "Boutique/ProduitReel/" . $ProduitReelId;
             $R_Produit = "Boutique/Produit/ProduitReel/" . $ProduitReelId;
             $ProduitsReels = $GLOBALS['Systeme']->Modules[$this->Module]->callData($R_ProduitReel);
             $Produits = $GLOBALS['Systeme']->Modules[$this->Module]->callData($R_Produit);     
             $this->OptionReelle = new genericClass("Boutique",$ProduitsReels[0] );
             $this->Option = new genericClass("Boutique",$Produits[0] );
         }
         if ( $DossierId != -1 ) {
             $R_Dossier = "Boutique/Dossier/" . $DossierId;
             $Dossiers = $GLOBALS['Systeme']->Modules[$this->Module]->callData($R_Dossier);
             $this->Dossier = new genericClass("Boutique",$Dossiers[0] );
         }
         
	 //print_r($this);
     }

    
   /**
     * Vérifie si l'objet est une commande d'option
     * 
     * @return boolean
     */function isOption() {
          return $this->Option->Get("Type") == "Options";
     }


   /**
     * Renvoie l'objet correspondant au type de l'option
     *
     * @return Objet Type
     */function getTypeOption() {
        $R_RecupererTypeProduit = "Boutique/Type/Nom=" . $this->Option->Get("TypeDoption");
        $TypeOptions = $GLOBALS['Systeme']->Modules[$this->Module]->callData($R_RecupererTypeProduit);
        $TypeOption = $TypeOptions[0];
        return new genericClass("Boutique",$TypeOption);
     }




   /**
     * Renvoie le nombre de participants associés au dossier
     *
     * @return int
     */function getNbreParticipants() {
         $R_RecupererParticipants = "Boutique/Dossier/" . $this->Dossier->Get("Id") . "/Personne";
         $Participants = $GLOBALS['Systeme']->Modules[$this->Module]->callData($R_RecupererParticipants);
         return count($Participants);
     }  

    
   /**
     * Fusionne les règles d'un objet Option et d'un autre TypeOption
     *
     * @param Objet::Option $Option 
     * @param Objet::TypeOption $TypeOption
     * @return array
     */function mergeRules( $Option, $TypeOption ) {
         $Regles = $this->TableauRegles;
         if ( $Option->Get("Restriction")!="") {
             $Regles[$Option->Get("Restriction")] = true;
         }else {
             $Regles["Unicite"] = true;
         }
         if ( $TypeOption->Get("TarifComprisAssurance") ) {
             $Regles["ComprisAssurance"] = true;
         }
         if ( $Option->Get("PasTous") ) {
             $Regles["PasTous"] = true;
         }
         if ( $TypeOption->Get("ObligatoireType") ) {
             $Regles["ObligatoireType"] = true;
         }
         return $Regles;
     }



   /**
     * Vérifie si la saisie correspond aux règles
     *
     * @param array $Regles Tableau des règles
     * @param int $NbParticipants Nombre de participants
     * @return boolean
     */function verifyRules( $Regles, $NbParticipants ) {
         $Qte = $this->Get("Quantite");
         if ($Regles["Unicite"]):
           return $Qte == $NbParticipants;
         elseif ( $Regles["Tous"] ):
           return $Qte == 1;
         elseif ( $Regles["AffecteUn"] ):
           return $Qte <= $NbParticipants;
	 elseif ( $Regles["AffecteDeux"]):
	   return $Qte * 2 <= $NbParticipants ;
	 elseif ( $Regles["AffecteTrois"]):
	   return $Qte * 3 <= $NbParticipants;
	 elseif ( $Regles["UnSeul"]) :
	   return $Qte == $NbParticipants && $Qte == 1;
	 elseif ( $Regles["PasTous"]) :
	   return $Qte < $NbParticipants;
	 else :
	   return true;
	 endif;
     }


    /**
     * Version de Verify compatible avec les cookies KEMl
     *
     * @param int $nParticipants Nombre de participants
     * @return boolean
     */function verifyCookies( $NbParticipants ) {
         $this->getNeededObjects();
         if ( $this->isOption() ) {
             $TypeOption = $this->getTypeOption();
             $Regles = $this->mergeRules($this->Option,$TypeOption);
             $Tarif = $this->getTarif();
             $this->Set("Montant",$Tarif);
             if ($this->Get("Quantite")!=0
                 && !$this->verifyRules($Regles,$NbParticipants) ) return false;
         }
         
         return genericClass::Verify();         
     }
    
   /**  
     * Surcharge de la méthode Verify pour le respect des règles
     * @return boolean
     */function Verify() {
         $this->getNeededObjects();
         if ( $this->isOption() ) {
             $TypeOption = $this->getTypeOption();
             $Regles = $this->mergeRules($this->Option,$TypeOption);
             $NbParticipants = $this->getNbreParticipants();
             $Tarif = $this->getTarif();
             $this->Set("Montant",$Tarif);
             if ($this->Get("Quantite")!=0
                 && !$this->verifyRules($Regles,$NbParticipants) ) return false;
         }
         return genericClass::Verify();
     }
       


   /**
     * Remplit automatiquement le champ Quantité
     * @return int:: nombre participants concernés
     */function setAutoQuantity($NbParticipants) {
         $this->getNeededObjects();    
         if ( $this->isOption() ) {
             $TypeOption = $this->getTypeOption();
             $Regles = $this->mergeRules($this->Option,$TypeOption);
	     $Qte = 0;
	     if ($Regles["Unicite"]):
	        $Qte = $NbParticipants;
                $ParticipantsConcernes = $NbParticipants;
	     elseif ( $Regles["Tous"] ):
	        $Qte = 1;
                $ParticipantsConcernes = $NbParticipants;  
	     elseif ( $Regles["AffecteUn"] ):
	        $Qte = $NbParticipants;
                $ParticipantsConcernes = $NbParticipants;
	     elseif ( $Regles["AffecteDeux"]):
	        $Qte = (int)($NbParticipants/2) ;
                $ParticipantsConcernes = $Qte*2;
	     elseif ( $Regles["AffecteTrois"]):
	        $Qte = (int)($NbParticipants/3) ;
                $ParticipantsConcernes = $Qte*3;
	     elseif ( $Regles["UnSeul"]) :
	        $Qte = 1;
                $ParticipantsConcernes = 1;             
	     elseif ( $Regles["PasTous"]) :
	        $Qte = $NbParticipants - 1;
                $ParticipantsConcernes = $Qte;             
	     endif;
	     $this->Set("Quantite",(string)$Qte);
             return $ParticipantsConcernes;
        }
         return 0;
     }

       /**
     * Remplit automatiquement le champ Quantité
     * @return int:: nombre participants concernés
     */function getNbParticipantsConcernes() {
         $this->getNeededObjects();    
         if ( $this->isOption() ) {
             $TypeOption = $this->getTypeOption();
             $Regles = $this->mergeRules($this->Option,$TypeOption);
	     $Qte = $this->Get("Quantite");
	     if ( $Regles["AffecteDeux"]):
                $ParticipantsConcernes = $Qte*2;
	     elseif ( $Regles["AffecteTrois"]):
                $ParticipantsConcernes = $Qte*3;
             else:
                $ParticipantsConcernes = $Qte;
	     endif;
             return $ParticipantsConcernes;
        }
         return 0;
     }
    
   /**
     * Renvoie le prix total
     *
     * @return float
     */function getTarif() {
         $PrixUnitaire = $this->OptionReelle->Get("Tarif");
         if (   $this->OptionReelle->Get("Reduction")
             && $this->OptionReelle->Get("ReductionStock")>0 ) {
             $PrixUnitaire -= $this->OptionReelle->Get("ReductionValeur");
         }
         return $PrixUnitaire;//* $this->Get("Quantite");
     }



   /**
     * Enleve une option similaire si déjà affectée au dossier
     *
     * @return void
     */function removeIfAlreadyExists() {
         $R_ProduitCommande = "Boutique/Dossier/" . $this->Dossier->Get("Id") . "/ProduitCommande";
         $ProduitsCommandes = $GLOBALS['Systeme']->Modules[$this->Module]->callData($R_ProduitCommande);
         foreach( $ProduitsCommandes as $PC ) {
             $R_ProduitReel = "Boutique/ProduitReel/ProduitCommande/" . $PC["Id"];
             $ProduitsReels = $GLOBALS['Systeme']->Modules[$this->Module]->callData($R_ProduitReel);
             $ObjPC = genericClass::createInstance($this->Module,$PC);
             $ObjPR = genericClass::createInstance($this->Module,$ProduitsReels[0] );
             if ( $ObjPR->Get("Id") == $this->OptionReelle->Get("Id") ) {
                 $ObjPC->Delete();
             }
         }
     }

    
   /**       
     * Surcharge de la méthode Save
     *     
     */function Save() {
        $this->getNeededObjects();
        if ( ($this->isOption()) ) {
            $this->removeIfAlreadyExists();
        }
        
        if ( $this->Get("Quantite") != 0 ) {
            return genericClass::Save();
        }
     }


   /**
     * Fonction appellée par Dossier pour vérifier que toutes
     * les options nécessaires sont sélectionnées.
     *
     * Conditions : Doit etre appellé après Verify () !
     * @param Array $Options Tableau de ProduitCommande
     * @return boolean
     */function verifyObligatoireType( $Options,$NbParticipants) {
         $Acceptable = false;
         $TypeOption = $this->getTypeOption();      
         $Regles = $this->mergeRules($this->Option,$TypeOption);
         if ( $Regles["Tous"]) {
             /* On vérifie dans les options qu'au moins une soit égale
              à un*/
             foreach( $Options as $Option ) {
                 if ( $Option->Get("Quantite") == 1 ) {
                     $Acceptable = true;
                 }
                 $Answer = "=";
             }
         }else{
             /* On vérifie que le total de quantité soit égale au
                total de participants */
             /* $NbParticipants = $this->getNbreParticipants(); */
             $NbCommandes = 0;
             foreach( $Options as $Option ) {
                 $NbCommandes += $Option->getNbParticipantsConcernes();
             }
             if ( $NbCommandes==$NbParticipants ) {
                 $Acceptable=true;
                 $Answer = "=";
             }
             elseif ( $NbCommandes >= $NbParticipants ) {
                 $Answer = ">";
             }
             else {
                 $Answer = "<";
             }
             
         }
         
         return array($Acceptable,$Answer);
     }
     
}

?>
